{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#%load_ext watermark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR:root:Line magic function `%watermark` not found.\n"
     ]
    }
   ],
   "source": [
    "%watermark -v -d -a 'Sebastian Raschka' -p scikit-learn,matplotlib,numpy,pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Principal Component Analysis in 3 Simple Steps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Principal Component Analysis (PCA) is a simple yet popular and useful linear transformation technique that is used in numerous applications, such as stock market predictions, the  analysis of gene expression data, and many more. In this tutorial, we will see that PCA is not just a \"black box\", and we are going to unravel its internals in 3 basic steps."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This article just got a complete overhaul, the original version is still available at [principal_component_analysis_old.ipynb](http://nbviewer.ipython.org/github/rasbt/pattern_classification/blob/master/dimensionality_reduction/projection/principal_component_analysis.ipynb)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sections"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- [Introduction](#Introduction)\n",
    "    - [PCA Vs. LDA](#PCA-Vs.-LDA)\n",
    "    - [PCA and Dimensionality Reduction](#PCA-and-Dimensionality-Reduction)\n",
    "    - [A Summary of the PCA Approach](#A-Summary-of-the-PCA-Approach)\n",
    "- [Preparing the Iris Dataset](#Preparing-the-Iris-Dataset)\n",
    "    - [About Iris](#About-Iris)\n",
    "    - [Loading the Dataset](#Loading-the-Dataset)\n",
    "    - [Exploratory Visualization](#Exploratory-Visualization)\n",
    "    - [Standardizing](#Standardizing)\n",
    "- [1 - Eigendecomposition - Computing Eigenvectors and Eigenvalues](#1---Eigendecomposition---Computing-Eigenvectors-and-Eigenvalues)\n",
    "    - [Covariance Matrix](#Covariance-Matrix)\n",
    "    - [Correlation Matrix](#Correlation-Matrix)\n",
    "    - [Singular Vector Decomposition](#Singular-Vector-Decomposition)\n",
    "- [2 - Selecting Principal Components](#2---Selecting-Principal-Components)\n",
    "    - [Sorting Eigenpairs](#Sorting-Eigenpairs)\n",
    "    - [Explained Variance](#Explained-Variance)\n",
    "    - [Projection Matrix](#Projection-Matrix)\n",
    "- [3 - Projection Onto the New Feature Space](#3---Selecting-Principal-Components)\n",
    "- [Shortcut - PCA in scikit-learn](#Shortcut---PCA-in-scikit-learn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The sheer size of data in the modern age is not only a challenge for computer hardware but also a main bottleneck for the performance of many machine learning algorithms. The main goal of a PCA analysis is to identify patterns in data; PCA aims to detect the correlation between variables. If a strong correlation between variables exists, the attempt to reduce the dimensionality only makes sense. In a nutshell, this is what PCA is all about: Finding the directions of maximum variance in high-dimensional data and project it onto a smaller dimensional subspace while retaining most of the information."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PCA Vs. LDA"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Both Linear Discriminant Analysis (LDA) and PCA are linear transformation methods. PCA yields the directions (principal components) that maximize the variance of the data, whereas LDA also aims to find the directions that maximize the separation (or discrimination) between different classes, which can be useful in pattern classification problem (PCA \"ignores\" class labels).   \n",
    "***In other words, PCA projects the entire dataset onto a different feature (sub)space, and LDA tries to determine a suitable feature (sub)space in order to distinguish between patterns that belong to different classes.***  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PCA and Dimensionality Reduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Often, the desired goal is to reduce the dimensions of a $d$-dimensional dataset by projecting it onto a $(k)$-dimensional subspace (where $k\\;<\\;d$) in order to increase the computational efficiency while retaining most of the information. An important question is \"what is the size of $k$ that represents the data 'well'?\"\n",
    "\n",
    "Later, we will compute eigenvectors (the principal components) of a dataset and collect them in a projection matrix. Each of those eigenvectors is associated with an eigenvalue which can be interpreted as the \"length\" or \"magnitude\" of the corresponding eigenvector. If some eigenvalues have a significantly larger magnitude than others that the reduction of the dataset via PCA onto a smaller dimensional subspace by dropping the \"less informative\" eigenpairs is reasonable.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A Summary of the PCA Approach"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-  Standardize the data.\n",
    "-  Obtain the Eigenvectors and Eigenvalues from the covariance matrix or correlation matrix, or perform Singular Vector Decomposition.\n",
    "-  Sort eigenvalues in descending order and choose the $k$ eigenvectors that correspond to the $k$ largest eigenvalues where $k$ is the number of dimensions of the new feature subspace ($k \\le d$)/.\n",
    "-  Construct the projection matrix $\\mathbf{W}$ from the selected $k$ eigenvectors.\n",
    "-  Transform the original dataset $\\mathbf{X}$ via $\\mathbf{W}$ to obtain a $k$-dimensional feature subspace $\\mathbf{Y}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preparing the Iris Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### About Iris"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the following tutorial, we will be working with the famous \"Iris\" dataset that has been deposited on the UCI machine learning repository   \n",
    "([https://archive.ics.uci.edu/ml/datasets/Iris](https://archive.ics.uci.edu/ml/datasets/Iris)).\n",
    "\n",
    "The iris dataset contains measurements for 150 iris flowers from three different species.\n",
    "\n",
    "The three classes in the Iris dataset are:\n",
    "\n",
    "1. Iris-setosa (n=50)\n",
    "2. Iris-versicolor (n=50)\n",
    "3. Iris-virginica (n=50)\n",
    "\n",
    "And the four features of in Iris dataset are:\n",
    "\n",
    "1. sepal length in cm\n",
    "2. sepal width in cm\n",
    "3. petal length in cm\n",
    "4. petal width in cm\n",
    "\n",
    "<img src=\"http://sebastianraschka.com/Images_old/2014_python_lda/iris_petal_sepal.png\" alt=\"Iris\" style=\"width: 200px;\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Loading the Dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In order to load the Iris data directly from the UCI repository, we are going to use the superb [pandas](http://pandas.pydata.org) library. If you haven't used pandas yet, I want encourage you to check out the [pandas tutorials](http://pandas.pydata.org/pandas-docs/stable/tutorials.html). If I had to name one Python library that makes working with data a wonderfully simple task, this would definitely be pandas!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_len</th>\n",
       "      <th>sepal_wid</th>\n",
       "      <th>petal_len</th>\n",
       "      <th>petal_wid</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal_len  sepal_wid  petal_len  petal_wid           class\n",
       "145        6.7        3.0        5.2        2.3  Iris-virginica\n",
       "146        6.3        2.5        5.0        1.9  Iris-virginica\n",
       "147        6.5        3.0        5.2        2.0  Iris-virginica\n",
       "148        6.2        3.4        5.4        2.3  Iris-virginica\n",
       "149        5.9        3.0        5.1        1.8  Iris-virginica"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv(\n",
    "    filepath_or_buffer='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', \n",
    "    header=None, \n",
    "    sep=',')\n",
    "\n",
    "df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']\n",
    "df.dropna(how=\"all\", inplace=True) # drops the empty line at file-end\n",
    "\n",
    "df.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# split data table into data X and class labels y\n",
    "\n",
    "X = df.ix[:,0:4].values\n",
    "y = df.ix[:,4].values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our iris dataset is now stored in form of a  $150 \\times 4$ matrix where the columns are the different features, and every row represents a separate flower sample.\n",
    "Each sample row $\\mathbf{x}$ can be pictured as a 4-dimensional vector   \n",
    "\n",
    "\n",
    "$\\mathbf{x^T} = \\begin{pmatrix} x_1 \\\\ x_2 \\\\ x_3 \\\\ x_4 \\end{pmatrix} \n",
    "= \\begin{pmatrix} \\text{sepal length} \\\\ \\text{sepal width} \\\\\\text{petal length} \\\\ \\text{petal width} \\end{pmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exploratory Visualization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To get a feeling for how the 3 different flower classes are distributes along the 4 different features, let us visualize them via histograms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGoCAYAAABL+58oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtAVHX+P/4n12FmAEcgScRE0SzDT1ui6yfXshaMQttN\nu6wXzNbdNs39WVrhhcRbmtnFT6Uu5KorfoqtjdYQt/1+yNI085ZioGampsPgJIMjwzAMM8z8/mCZ\nQGaGmcOZq8/HP8yc87683jPD4cWZc97vEKvVagURERFREAn1dQBEREREYmOCQ0REREGHCQ4REREF\nHSY4REREFHSY4BAREVHQYYJDREREQcelBKeiogI5OTkAgJMnT2LKlCmYNm0a/vCHP6Curs6jARLR\n9aP9saaurg6zZs1CTk4OJk+ejIsXL/o4OiIKJOFdFdi4cSO2b98OuVwOAFi5ciUWL16MwYMH4+9/\n/zsKCwsxf/58jwdKRMHt2mPNmjVr8NBDDyErKwsHDhzA2bNn0bdvXx9HSUSBosszOP369cO6dets\nz998800MHjwYAGA2myGRSDwXHRFdN6491nzzzTe4dOkSnnzySezYsQO//OUvfRgdEQWaLhOczMxM\nhIWF2Z4nJCQAaD34vPfee5g+fbrHgiOi68e1x5rq6mooFAps3rwZN954IwoLC30YHREFmi6/orJn\n586dKCgoQGFhIXr27Gm3zJEjR7oVGBEFhmHDhnmkXYVCgXvvvRcAcN9992Ht2rV2y/FYQ3R9cPdY\n43aCs337dnzwwQcoKipCbGysqMGISaVSISkpyaN9bNhQiuTk8Z22azQaxMfHAwCUylLMnNm5jKd4\nY9zs27/692Xfnkwuhg0bht27d+Ohhx7CoUOHMHDgQKdlA52vP8NiKVq1CjlpaYLrlyqVGD9zpogR\nCRMs70ewjEPIscatBMdisWDlypVISkrCM888g5CQEIwYMQKzZ892u2MiImdyc3ORl5eH999/HzEx\nMXj99dd9HRIRBRCXEpw+ffqguLgYAHDgwAGPBkRE16/2x5qkpCRs2rTJxxERUaDiRH9EREQUdJjg\nEBERUdBhgkNERERBhwkOERERBR0mOERERBR0mOAQERFR0BE0kzEREZG/Kykph1ptEFRXq9VCoVB0\n2p6YKMWECRndDY28gAkOEREFJbXaYHe2eVdIpT/PSN+eUlna3bDIS/gVFREREQUdJjhEREQUdJjg\n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\nX36JDz/8sNP2xx9/HCqVClevXsWOHTtcavvjjz/Gvffeiy1btrgdNwCsXbsWv/rVr0Q7PpL4wrsu\nQiSOr7/+GufOneu0QKYjv//975GdnS2orxUrVuDChQuC6hKRfxo9erTd7SEhIQBaFyLetWsXxo0b\n51J748ePx/Tp0wXF8uyzz0KtVguqS97BBCcAnT9/HgsWLEB4eDisVitef/11JCYm4o033sCRI0fQ\n0tKCJ598Evfffz9ycnIwYMAAnD17FkDrfx09e/bE4sWLcenSJVy+fBn33XefbYVjR8xmM/Lz83Hh\nwgVYLBY8++yzGD58OB566CGMGDEC3333HUJCQrB+/XpER0fbZqCMj4+HUqnE+vXrUVhYCKPRiDvu\nuANA61ma2tpaNDU14fXXX0dycrLdvisqKrBq1SpYrVYkJiZizZo1+MMf/oBbbrkF33//PWQyGdLT\n07F3717odDps2rQJMTExdhdrIyL3eeuYo9VqMX36dPzzn//EsWPH8NRTT+HgwYNQq9VYuHAhxo0b\nh7Nnz2LevHl48803sXfvXtx44424cuUKAKCgoADfffed7SxPcXEx3n33XTQ0NGDJkiUYOnSo3fH9\n+OOPyMvLg8lkglQqxeuvv441a9YgPDwcKpUKzc3NePDBB/H555+jpqYG69evR9++fT30apNY+BVV\nANq3bx9uv/12bNmyBbNnz4ZOp8OePXtQXV2N//3f/8XWrVuxYcMG24qxw4YNQ1FRER544AFs2LAB\nly5dwi9+8Qts3LgRH374Id5///0u+/zwww8RFxeHoqIirFu3DkuXLgXQuj7I+PHjUVRUhF69emHP\nnj347LPPcPXqVXzwwQd4+eWXoVarERYWhqeeegrjxo2zncG599578be//c22kKMj+fn5WLVqFf7+\n97/jnnvuwQ8//AAAttegubkZUqkUmzZtQmpqKg4ePNjdl5iI2vHWMUehUKBnz55Qq9X48ssvkZSU\nhG+//RafffYZxo4dC6D1bE1lZSWOHDmCjz76CKtXr4ZerwcAPP300xg5ciQeffRRAEBaWhr+9re/\nYerUqfj4448djm/16tV4+umnUVxcjGnTpuHkyZMAgOTkZPz1r3/FgAEDUF1djcLCQowdO9b2VTv5\nN57BCUCPPvooCgsLMWPGDMTGxuLZZ5/F6dOnUVlZaVsnqKWlBdXV1QCAX/7ylwCAO++8E7t27UJs\n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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10b8eeba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import math\n",
    "\n",
    "label_dict = {1: 'Iris-Setosa',\n",
    "              2: 'Iris-Versicolor',\n",
    "              3: 'Iris-Virgnica'}\n",
    "\n",
    "feature_dict = {0: 'sepal length [cm]',\n",
    "                1: 'sepal width [cm]',\n",
    "                2: 'petal length [cm]',\n",
    "                3: 'petal width [cm]'}\n",
    "\n",
    "with plt.style.context('seaborn-whitegrid'):\n",
    "    plt.figure(figsize=(8, 6))\n",
    "    for cnt in range(4):\n",
    "        plt.subplot(2, 2, cnt+1)\n",
    "        for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):\n",
    "            plt.hist(X[y==lab, cnt],\n",
    "                     label=lab,\n",
    "                     bins=10,\n",
    "                     alpha=0.3,)\n",
    "        plt.xlabel(feature_dict[cnt])\n",
    "    plt.legend(loc='upper right', fancybox=True, fontsize=8)\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Standardizing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Whether to standardize the data prior to a PCA on the covariance matrix depends on the measurement scales of the original features. Since PCA yields a feature subspace that maximizes the variance along the axes, it makes sense to standardize the data, especially, if it was measured on different scales. Although, all features in the Iris dataset were measured in centimeters, let us continue with the transformation of the data onto unit scale (mean=0 and variance=1), which is a requirement for the optimal performance of many machine learning algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "X_std = StandardScaler().fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 - Eigendecomposition - Computing Eigenvectors and Eigenvalues"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The eigenvectors and eigenvalues of a covariance (or correlation) matrix represent the \"core\" of a PCA: The eigenvectors (principal components) determine the directions of the new feature space, and the eigenvalues determine their magnitude. In other words, the eigenvalues explain the variance of the data along the new feature axes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Covariance Matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classic approach to PCA is to perform the eigendecomposition on the covariance matrix $\\Sigma$, which is a $d \\times d$ matrix where each element represents the covariance between two features. The covariance between two features is calculated as follows:\n",
    "\n",
    "$\\sigma_{jk} = \\frac{1}{n-1}\\sum_{i=1}^{N}\\left(  x_{ij}-\\bar{x}_j \\right)  \\left( x_{ik}-\\bar{x}_k \\right).$\n",
    "\n",
    "We can summarize the calculation of the covariance matrix via the following matrix equation:   \n",
    "$\\Sigma = \\frac{1}{n-1} \\left( (\\mathbf{X} - \\mathbf{\\bar{x}})^T\\;(\\mathbf{X} - \\mathbf{\\bar{x}}) \\right)$  \n",
    "where $\\mathbf{\\bar{x}}$ is the mean vector \n",
    "$\\mathbf{\\bar{x}} = \\sum\\limits_{i=1}^n x_{i}.$  \n",
    "The mean vector is a $d$-dimensional vector where each value in this vector represents the sample mean of a feature column in the dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix \n",
      "[[ 1.00671141 -0.11010327  0.87760486  0.82344326]\n",
      " [-0.11010327  1.00671141 -0.42333835 -0.358937  ]\n",
      " [ 0.87760486 -0.42333835  1.00671141  0.96921855]\n",
      " [ 0.82344326 -0.358937    0.96921855  1.00671141]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "mean_vec = np.mean(X_std, axis=0)\n",
    "cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1)\n",
    "print('Covariance matrix \\n%s' %cov_mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix \n",
      "[[ 1.00671141 -0.11010327  0.87760486  0.82344326]\n",
      " [-0.11010327  1.00671141 -0.42333835 -0.358937  ]\n",
      " [ 0.87760486 -0.42333835  1.00671141  0.96921855]\n",
      " [ 0.82344326 -0.358937    0.96921855  1.00671141]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "mean_vec = np.mean(X_std, axis=0)\n",
    "cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1)\n",
    "print('Covariance matrix \\n%s' %cov_mat)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The more verbose way above was simply used for demonstration purposes, equivalently, we could have used the numpy `cov` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NumPy covariance matrix: \n",
      "[[ 1.00671141 -0.11010327  0.87760486  0.82344326]\n",
      " [-0.11010327  1.00671141 -0.42333835 -0.358937  ]\n",
      " [ 0.87760486 -0.42333835  1.00671141  0.96921855]\n",
      " [ 0.82344326 -0.358937    0.96921855  1.00671141]]\n"
     ]
    }
   ],
   "source": [
    "print('NumPy covariance matrix: \\n%s' %np.cov(X_std.T))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we perform an eigendecomposition on the covariance matrix:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eigenvectors \n",
      "[[ 0.52237162 -0.37231836 -0.72101681  0.26199559]\n",
      " [-0.26335492 -0.92555649  0.24203288 -0.12413481]\n",
      " [ 0.58125401 -0.02109478  0.14089226 -0.80115427]\n",
      " [ 0.56561105 -0.06541577  0.6338014   0.52354627]]\n",
      "\n",
      "Eigenvalues \n",
      "[ 2.93035378  0.92740362  0.14834223  0.02074601]\n"
     ]
    }
   ],
   "source": [
    "cov_mat = np.cov(X_std.T)\n",
    "\n",
    "eig_vals, eig_vecs = np.linalg.eig(cov_mat)\n",
    "\n",
    "print('Eigenvectors \\n%s' %eig_vecs)\n",
    "print('\\nEigenvalues \\n%s' %eig_vals)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Correlation Matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Especially, in the field of \"Finance,\" the correlation matrix typically used instead of the covariance matrix. However, the eigendecomposition of the covariance matrix (if the input data was standardized) yields the same results as a eigendecomposition on the correlation matrix, since the correlation matrix can be understood as the normalized covariance matrix."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Eigendecomposition of the standardized data based on the correlation matrix:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eigenvectors \n",
      "[[ 0.52237162 -0.37231836 -0.72101681  0.26199559]\n",
      " [-0.26335492 -0.92555649  0.24203288 -0.12413481]\n",
      " [ 0.58125401 -0.02109478  0.14089226 -0.80115427]\n",
      " [ 0.56561105 -0.06541577  0.6338014   0.52354627]]\n",
      "\n",
      "Eigenvalues \n",
      "[ 2.91081808  0.92122093  0.14735328  0.02060771]\n"
     ]
    }
   ],
   "source": [
    "cor_mat1 = np.corrcoef(X_std.T)\n",
    "\n",
    "eig_vals, eig_vecs = np.linalg.eig(cor_mat1)\n",
    "\n",
    "print('Eigenvectors \\n%s' %eig_vecs)\n",
    "print('\\nEigenvalues \\n%s' %eig_vals)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Eigendecomposition of the raw data based on the correlation matrix:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eigenvectors \n",
      "[[ 0.52237162 -0.37231836 -0.72101681  0.26199559]\n",
      " [-0.26335492 -0.92555649  0.24203288 -0.12413481]\n",
      " [ 0.58125401 -0.02109478  0.14089226 -0.80115427]\n",
      " [ 0.56561105 -0.06541577  0.6338014   0.52354627]]\n",
      "\n",
      "Eigenvalues \n",
      "[ 2.91081808  0.92122093  0.14735328  0.02060771]\n"
     ]
    }
   ],
   "source": [
    "cor_mat2 = np.corrcoef(X.T)\n",
    "\n",
    "eig_vals, eig_vecs = np.linalg.eig(cor_mat2)\n",
    "\n",
    "print('Eigenvectors \\n%s' %eig_vecs)\n",
    "print('\\nEigenvalues \\n%s' %eig_vals)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can clearly see that all three approaches yield the same eigenvectors and eigenvalue pairs:\n",
    "    \n",
    "- Eigendecomposition of the covariance matrix after standardizing the data.\n",
    "- Eigendecomposition of the correlation matrix.\n",
    "- Eigendecomposition of the correlation matrix after standardizing the data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Singular Vector Decomposition"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "While the eigendecomposition of the covariance or correlation matrix may be more intuitiuve, most PCA implementations perform a Singular Vector Decomposition (SVD) to improve the computational efficiency. So, let us perform an SVD to  confirm that the result are indeed the same:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vectors U:\n",
      " [[-0.52237162 -0.37231836  0.72101681  0.26199559]\n",
      " [ 0.26335492 -0.92555649 -0.24203288 -0.12413481]\n",
      " [-0.58125401 -0.02109478 -0.14089226 -0.80115427]\n",
      " [-0.56561105 -0.06541577 -0.6338014   0.52354627]]\n"
     ]
    }
   ],
   "source": [
    "u,s,v = np.linalg.svd(X_std.T)\n",
    "print('Vectors U:\\n', u)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2 - Selecting Principal Components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sorting Eigenpairs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The typical goal of a PCA is to reduce the dimensionality of the original feature space by projecting it onto a smaller subspace, where the eigenvectors will form the axes. However, the eigenvectors only define the directions of the new axis, since they have all the same unit length 1, which can confirmed by the following two lines of code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Everything ok!\n"
     ]
    }
   ],
   "source": [
    "for ev in eig_vecs:\n",
    "    np.testing.assert_array_almost_equal(1.0, np.linalg.norm(ev))\n",
    "print('Everything ok!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In order to decide which eigenvector(s) can dropped without losing too much information\n",
    "for the construction of lower-dimensional subspace, we need to inspect the corresponding eigenvalues: The eigenvectors with the lowest eigenvalues bear the least information about the distribution of the data; those are the ones can be dropped.  \n",
    "In order to do so, the common approach is to rank the eigenvalues from highest to lowest in order choose the top $k$ eigenvectors."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eigenvalues in descending order:\n",
      "2.91081808375\n",
      "0.921220930707\n",
      "0.147353278305\n",
      "0.0206077072356\n"
     ]
    }
   ],
   "source": [
    "# Make a list of (eigenvalue, eigenvector) tuples\n",
    "eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]\n",
    "\n",
    "# Sort the (eigenvalue, eigenvector) tuples from high to low\n",
    "eig_pairs.sort(key=lambda x: x[0], reverse=True)\n",
    "\n",
    "# Visually confirm that the list is correctly sorted by decreasing eigenvalues\n",
    "print('Eigenvalues in descending order:')\n",
    "for i in eig_pairs:\n",
    "    print(i[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Explained Variance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After sorting the eigenpairs, the next question is \"how many principal components are we going to choose for our new feature subspace?\" A useful measure is the so-called \"explained variance,\" which can be calculated from the eigenvalues. The explained variance tells us how much information (variance) can be attributed to each of the principal components."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "tot = sum(eig_vals)\n",
    "var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]\n",
    "cum_var_exp = np.cumsum(var_exp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlUVPX/P/DnsBlruITihkoWaaGyW4ILkiig5AoormWS\nC4oLiqi4kKZSVqSiqQT6C000F0iT3FM/omWYpCGiFCC4kWyyzf394fF+GWEYRBku8nyc4xHm3rnz\nvG848+Leuff9kgmCIICIiEhiNOo7ABERUVVYoIiISJJYoIiISJJYoIiISJJYoIiISJJYoIiISJLq\ntED98ccf8PX1BQCkp6fDx8cHY8aMwdKlS8V1du3ahWHDhsHLywvHjx+vyzhERNSA1FmB+vbbbxEc\nHIzS0lIAwMqVKxEQEIDt27dDLpcjISEBd+/eRXR0NHbu3Ilvv/0WYWFh4vpERNS41VmBMjMzwzff\nfCN+f+XKFdjY2AAAnJyccObMGSQlJcHa2hpaWlowMDBAhw4dcO3atbqKREREDUidFSgXFxdoamqK\n31ecsEJfXx/5+fkoKCiAoaGh+Lienh7y8vLqKhIRETUgWup6IQ2N/6uFBQUFMDIygoGBAfLz8ys9\nXpWLFy/WeUYiIqo71tbWz7S+2gpUly5dkJiYCFtbW5w8eRIODg5455138MUXX6CkpATFxcW4ceMG\nOnfurHQbz7pzUpCZmYnWrVvXd4xnxtzq1bSpHLm5vKhWXYyN5XjwoOGNd0P9/QZqd5ChtgIVGBiI\nRYsWobS0FObm5nB1dYVMJoOvry98fHwgCAICAgKgo6OjrkhEkpGbq4GGOG1zQ33DzMy8DaDh5W5s\n6rRAtWnTBjExMQCADh06IDo6utI6I0aMwIgRI+oyBhERNUAN7xiXiIgaBRYoIiKSJBYoIiKSJBYo\nIiKSJBYoIiKSJBYoIiKSJLXdB0UNS9eurZCbW98paqNh3ttibCwH/14kUsQCRVXijaPqxRtHiSrj\nn2xERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBE\nRCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJ\nLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBERCRJLFBE\nRCRJLFBERCRJLFBERCRJWup8sbKyMgQGBiIjIwNaWlpYvnw5NDU1MX/+fGhoaKBz585YsmSJOiMR\nEZFEqbVAnThxAnK5HDExMThz5gy++OILlJaWIiAgADY2NliyZAkSEhLQv39/dcYiIiIJUuspvg4d\nOqC8vByCICAvLw9aWlpITk6GjY0NAMDJyQlnz55VZyQiIpIotR5B6evr499//4Wrqytyc3OxceNG\nXLhwQWF5Xl6eOiMREZFEqbVARUZGwtHREbNmzUJ2djZ8fX1RWloqLi8oKICRkZHS52dmZqoj5guV\nl5fXIHMDrRtk7oY63sytXszdMKi1QL366qvQ0nr8koaGhigrK0OXLl1w/vx52NnZ4eTJk3BwcFD6\n/NatW6sr6guTmZnZIHMDHG91Ym71Ym71y8rKeubnqLVAjRs3DkFBQRg9ejTKysowZ84cdO3aFcHB\nwSgtLYW5uTlcXV3VGYmIiCRKrQVKT08P69atq/R4dHS0OmMQEVEDwBt1iYhIkligiIhIkligiIhI\nkligiIhIkligiIhIkligiIhIkligiIhIkligiIhIkligiIhIkligiIhIkligiIhIkligiIhIklig\niIhIktQ6m3ldW7x4HdLTc+s7hoK9e6fg4cP6TvHsjI3l4N8vRFSfXqoClZ6eiw4dQuo7hoIPP8yD\noWF9p1B082YIIiNDql0nM/M2gIbZGI2IXg4q/0S+ffs2ZsyYATc3N0ydOhX//vuvOnIREVEjp7JA\nBQcHY8iQIfj+++/xwQcfYOHCherIRUREjZzKAlVcXAxnZ2cYGRmhf//+KC8vV0cuIiJq5FQWqPLy\ncly7dg0AxP+JiIjqmsqLJIKDgxEUFIScnBy0bNkSy5cvV0cuIiJq5FQWqC5duiA2NlYdWYiIiERK\nC9SMGTPw1VdfoVevXpWWnT59uk5DERERKS1QX331FQDghx9+gKmpqfh4ampq3aciIqJGT2mB+vvv\nv5GdnY21a9di3rx5EAQBcrkcYWFh2LdvnzozEhFRI6S0QD18+BDx8fG4d+8eDh48CACQyWTw8fFR\nWzgiImq8lBYoGxsb2NjY4MqVK+jatas6MxEREam+iu/27dv4/PPPUVpaCkEQkJubiwMHDqgjGxER\nNWIqb9Rdt24dpk2bBlNTU3zwwQd488031ZGLiIgaOZUFysTEBD169AAADB06FNnZ2XUeioiISGWB\n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\n5RfWMHDEKAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1101c2780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with plt.style.context('seaborn-whitegrid'):\n",
    "    plt.figure(figsize=(6, 4))\n",
    "\n",
    "    plt.bar(range(4), var_exp, alpha=0.5, align='center',\n",
    "            label='individual explained variance')\n",
    "    plt.step(range(4), cum_var_exp, where='mid',\n",
    "             label='cumulative explained variance')\n",
    "    plt.ylabel('Explained variance ratio')\n",
    "    plt.xlabel('Principal components')\n",
    "    plt.legend(loc='best')\n",
    "    plt.tight_layout()\n",
    "    plt.savefig('/Users/Sebastian/Desktop/pca2.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The plot above clearly shows that most of the variance (72.77% of the variance to be precise) can be explained by the first principal component alone. The second principal component still bears some information (23.03%) while the third and fourth principal components can safely be dropped without losing to much information. Together, the first two principal components contain 95.8% of the information."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Projection Matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It's about time to get to the really interesting part: The construction of the projection matrix that will be used to transform the Iris data onto the new feature subspace. Although, the name \"projection matrix\" has a nice ring to it, it is basically just a matrix of our concatenated top *k* eigenvectors.\n",
    "\n",
    "Here, we are reducing the 4-dimensional feature space to a 2-dimensional feature subspace, by choosing the \"top 2\" eigenvectors with the highest eigenvalues to construct our $d \\times k$-dimensional eigenvector matrix $\\mathbf{W}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Matrix W:\n",
      " [[ 0.52237162 -0.37231836]\n",
      " [-0.26335492 -0.92555649]\n",
      " [ 0.58125401 -0.02109478]\n",
      " [ 0.56561105 -0.06541577]]\n"
     ]
    }
   ],
   "source": [
    "matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1), \n",
    "                      eig_pairs[1][1].reshape(4,1)))\n",
    "\n",
    "print('Matrix W:\\n', matrix_w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3 - Projection Onto the New Feature Space"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this last step we will use the $4 \\times 2$-dimensional projection matrix $\\mathbf{W}$ to transform our samples onto the new subspace via the equation  \n",
    "$\\mathbf{Y} = \\mathbf{X} \\times  \\mathbf{W}$, where $\\mathbf{Y}$ is a $150\\times 2$ matrix of our transformed samples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "Y = X_std.dot(matrix_w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYlGX6wPEvhxkYBVQIFVaFPJT2cw20NEvXUGi1zbQj\nYJLptElqmaes7GAWauWhg5onUitFy9WsNNs8tK1thSmErdWmCSmgIB7RgRng/f2BTBxmmBmYI9yf\n6/Iqhpn3vR1f5uZ53ue5by9FURSEEEIIN+Pt6gCEEEIIUyRBCSGEcEuSoIQQQrglSVBCCCHckiQo\nIYQQbkkSlBBCCLfk6+wTVlRU8Oyzz3Ls2DG8vb158cUX6dq1q7PDEEII4eacPoLas2cPXl5epKWl\nMXnyZBYtWuTsEIQQQngAp4+gYmNjGTx4MAC5ubm0atXK2SEIIYTwAE5PUADe3t489dRT7Nq1izff\nfNMVIQghhHBzXq4sdVRUVMR9993Hjh078Pf3Nz5+4MABV4UkhBDCSfr06VPv950+gtq2bRunTp3i\nkUcewc/PD29vb7y9694KsxS4u8rLyyM8PNzVYTSIxO46nhy/xO46nhy/NQMRpyeo2267jaeffprR\no0dTVlbGrFmzUKvVzg5DCCGEm3N6gtJoNLz++uvOPq0QQggPIxt1hRBCuCVJUEIIIdySJCghhBBu\nSRKUEEIItyQJSggnKSwsZP/+/RQWFro6FCE8giQoIZxgU1oa3SMiSI6Lo3tEBJvS0lwdkhBuTxKU\nEA5WWFjIBK2WvTodB86fZ69OxwStVkZSQlggCUoIB8vOziZSrabXla97AREqFdnZ2S6MSgj3JwlK\nCAeLjIwkW68n68rXWUCOwUBkZKQLoxLC/UmCEsLBQkNDWZaaSoxGQ++gIGI0GpalphIaGurq0IRw\nay5ptyFEcxOfmMjg2NjK6b7ISElOQlhBEpQQThIaGiqJSQgbyBSfEEIItyQJSgghhFuSBCWEEMIt\nSYIS9ZLyPEIIV5EEJcxKS9tERER34uKSiYjoTlraJleHJIRoRiRBCZMKCwvRaieg0+3l/PkD6HR7\n0WonyEhKCOE0kqCESdnZ2ajVkVCtQI9KFSHleYQQTiMJSpgUGRmJXp8N1Qr0GAw5Up5HCOE0kqCE\nSaGhoaSmLkOjiSEoqDcaTQypqctko6kQwmmkkoQwKzExntjYwVKeRwjhEpKgRL2kPI8QwlVkik8I\nIYRbkgQlhBDCLUmCEkII4Zaceg+qrKyMZ555htzcXAwGA8nJyQwePNiZIQhhN4WFhbKARAgHcuoI\n6uOPP6ZNmzasX7+eVatW8dJLLznz9ELYzaa0NLpHRJAcF0f3iAg2paW5OiQhmhynjqCGDRvG0KFD\nAaioqMDXVxYRCs9TWFjIBK2WvTodvXQ6soAYrZbBsbEykhLCjpyaITQaDQDFxcVMnjyZKVOmmH1u\nXl6es8Kyq4sXL0rsLuDM2DMzM4nw9a1WBAo6+fqyf/9+oqKiGnRMee9dw5NjB8+P3xKnD2Hy8/OZ\nNGkSo0eP5vbbbzf7vPDwcCdGZT95eXkSuws4M3aVSkVOWRlZVCanLOD3sjJuvPHGBo+g5L13DU+O\nHTw7/vz8fIvPceo9qNOnT6PVapkxYwZ33XWXM08thN2EhoayLDWVGI2G3kFBxGg0LEtNlek9IezM\nqSOoFStWcOHCBZYtW8bSpUvx8vJi9erVqNVqZ4YhhE1MrdaLT0xkcGysrOITwoGcmqBmzZrFrFmz\nnHlKIRplU1oaE7RaItVqsvV6lqWmEp+YCEgZKCEcTTbqCmFG9dV6B86fZ69OxwSt1mObNhYWFrJ/\n/36PjV80P5KghDAjOzubSLW6xmq9CJXKrZs2mktCsm9LeCJJUEKYERkZSbZeX61lI+QYDG7btNFc\nEnKnkaCM4oQtJEEJYYYnrdarLwm5y0gwLS2NiK4RxN0fR0TXCNI2yihO1E9KOQhRD09ZrWdMQjod\nUDMJVR8JVu3bcvZIsLCwEG2yFt0oHbr2OjgJ2vFaYodI9Q1hnoyghLAgNDS0UZtwnaG+6Uh3GAlm\nZGTg3cob2l95oD2ogt37fp5wPRlBCdEEGJOQVkuESkWOwVAjCblyJLgpLY3kceO4XF4CJ6lMUifB\ncMZ97+cJ9yAJSggXKywsJDMzE5VKZUwctrbyKCwspHPXruw7cIDi4mKTr3PFvq2qe2P/Kinhv8C4\n1VASCJoyDakr3fN+nnAfMsUnhJUcsQKtauXdswkJxpV3ti4Jr774oM9NfThy9IjbfPBXX6CRCPxe\nBtfoW/LR5o9ITEh0dXjCzUmCEsIKjthHVH3l3cGLF40r75LHjbN6SXj1xQfnHzqPbpQO7Xj32Uxc\n+95YPnC6ooLo6GhXhiU8hCQoISxw1D4iU8u/O3h7087Hx+ol4dnZ2aiD1W67+MAdFmgIzyX3oISw\noL4l3I35oDW1/PtERQUVimL1kvDIyEj0Z/RuvfjAU5bqC/cjCUoICxy1j6j6yrtOvr78XlbGstRU\nALOr8UwdI3VFKtrxWlTBKgxnDKSucL8RihTWFQ0hCUoICywt4W6MqtHF/v37a+y1smXEkZiQSOwQ\n145QbF11KIQ1JEEJYQVHTlOFhoYSFRVV45i2jjhcOULZtnUrz86YYbIliRCNIQlKCCu50zSVu4xY\nCgsLmTV9Ol+WlNBLpyOLyunJwbFSwkg0nqziE8KNmdp75U6tM7Kzs4lUqVxeiFY0TZKghHBTphKR\nO7XOgCsLSAwGj2lJIjyLJCgh3JC5RJSRkeEWrTOqhIaGkrJwoexzEg4h96CEcEPm9l4BLm+dUduI\nkSO597773OKemGhaZAQlhBsy1z4jOjraLSszWNuSRDrqCltIghLCDdVXIig+MZGfc3JYsWsXP+fk\neMySbumoK2wlU3xCuKmmVCJIOuqKhpARVBMhUydNk6mpM3daZm4tdy9qK9yTJKgmIC1tExER3YmL\nSyYiojtpaZtcHZKwQkN+qXC3ZebWqlHUFtyyqK1wPy5JUD/88ANJSUmuOHWTU1hYiFY7AZ1uL+fP\nH0Cn24tWO8HtP7Cau9qjoDffeMOqfzNTLTo8YWNsVVFbzQYNQWuD0GzQuGVRW+FenJ6gVq9ezbPP\nPovBYHD2qZuk7Oxs1OpIqPaRpVJFuP0HVnNmahT01quvck2nThan62qv7vsSOFpaSkBAgKPDbrTE\nhERyjuSw64Nd5BzJkY66wiKnJ6iIiAiWLl3q7NM2WZGRkej12VBtQbLBkCNTJ27M1CjoWmBpSYnF\n6brqq/s6+/tzOxDh7c2APn084l6UtcvRhQAXJKi4uDh8fHycfVqPYet9idDQUFJTl6HRxBAU1BuN\nJobU1GXyAeDGTO5xAuKwbrouPjGRfQcOcFZR+BbI0uk84l6ULOQRtnLbZeZ5eXmuDqFBLl682ODY\nt27dxvTps1CpIjEYslm4MIWRI0dYfN2gQQP57rsvOX78OB07diQkJKRBMTQmdlfztNhfXrCAW6dN\nI7ikhDPA20A+lVUi/P39Lf5djh07xtVqNb1KS4HKUVgnX1/2799PVFSUo8OvwZr3ftvWrcyaPp1I\nlYpsg4GUhQsZMXKk1ecoKiqqcX3bi6ddN7V5evwWKS5w4sQJ5f777zf7/e+//96J0dhXbm5ug15X\nUFCgaDTBCvyggKLAD4pGE6wUFBSYfX56errZ7zdEQ2N3B54Ye0FBgZLy0ktKa39/JSowUAnWaJSN\nGzZY/dpgjUb5ofJiUX4AJVijsev1YC1L731jY92wYYOiCdIorSJbKZogjbIhzbr3yBqeeN1U58nx\nW/M5b3aKLzMzk7vvvpvExES+//574+MTJ060S2L08vKyy3GaClsWO8iy8qYhNDSUZ559lv/9/jsp\nGzfaXBVi2jPPMMjf361KHpnSmJWH1Tf4nn/oPLpROrTj3XsqU9iP2QQ1f/58Fi5cyJw5c0hJSWHf\nvn0AXLhwodEn/dOf/sTGjRsbfZymxNrFDrKsvOkx1VG3PlVL1P+xYAHeXl7cO2OGW5c8CggI4EhJ\nCV9e+dqWAreywbd5M5ugVCoVV199Nd26dWPlypW88sor/PLLLzLycRBrFzvIsvLmpfbCAlNL1BfO\nneviKM1LS0ujz019MFzlTYwvRGr8bRrtyQbf5s3sIomWLVvy7rvvkpCQQGhoKAsWLOCJJ55Ar9c7\nM75mJTExntjYwfXWXqs50qpsuCDLypumTWlpTNBqiVSrydbrWZaaSpuQEDp6e5ucLnO36b3q03O0\nB07CyfcVMtIP0qNHD6uOUbXBVzteiypYheGMQTb4NiNmE9SCBQtYs2YNer0etVrNtddey1tvvcWi\nRYucGV+zExoaWu8PX9VIS6uNQaWKwGDIkWXlTVD1kVIvnY4sYMCYMfj4+KAvKXGrflDmVE3P6dpX\n9rSiPfhd5UdxcbFNx0lMSCR2iP2L5hYWFpKZmYlKpZKfHzdlNkEFBATw2GOP1Xisa9euLFu2zOFB\nifpZM9KqUlhYaPZ59X1PuFbthoVhQLnBwD6DgZ+AW4Fg4KwbL47Q6/VcPnUZjgFX06jpOUu/uNkq\nLS0NbbIW3za+lJ0tI3VFqlS2cENSLNZDWbMjv77VfrIS0L3V3sz7BRBO5agpHvgF8GnZkrSPPnLL\nxRGPPfYYA2IGYNAYYD2o3lC5Tf296lOPF8delJWBbsxtN+qKxqm+2k+nq5wM0mpjiI0dDGDye999\n9yXh4eEujVtUMpY00mqJUKk4ptejVFSQpdfTi8pNvacrKoiOjnZ1qEZVI3K9Xs+SFUtAi/Hek2G1\ngb1f7uWWW25xdZgmpx6rVga6OnmKmsyOoMrLy9Hr9UyaNAmDwYBer6e0tJQHH3zQmfGJBqpvtd+K\nFavQ6YLrfO/48eNSjsaNVO+c+7/ff2fF2rVu1+q9SvXq7H+NiYEgaiwNpxUcOXLEhRH+QVYGeg6z\nI6h//OMfLF++nNOnTzN06FAURcHb25sbbrjBmfEJG1X9FhsQEGBytV9AQAApKa8BXnW+l5X1I/fe\nm4RaXblSMDV1GYmJ8a77y4ga916qOuxmZGQA1Bk9OfueYtX5Ll++XGNBx0fAXeepTABXRlBcgL59\n+zo8JmtUXxno29qXsnNlbjH1KEywVGriww8/tEdVC5s0x1JH9rBhw0ZFowlWWrXqrWg0wcqkSY8r\nGk2wEhQUrWg0wcqGDRuV9PR0pVWr3gpsVCBYgWgFWihPPfW04u/fxupSS+7Gk0u+KIr18W/csEEJ\n1miU3q1a1SiNZO5xR6lefkjdUq1EajTKlQtHUUAJUfkq+KIQgoIKZdJjkxwaT0MUFBQo27dv95hr\n3BRPvu6t+Zy3mKDy8vKUlStXKm+99Zbxj6NJgrKduVp+hw8frlGzr+bzChRYr/j7t1Y+//xzJTAw\nuvpnjBIUFK2kp6e75O9jK0/+QVUU6+I3V9Pu8OHDTq3LV1BQoGiCNArJKMym8r++KHtrnX/fvn3K\n2rVrlcOHDzskDntoDteNu7Lmc97iIonJkyfTv39/wsLCnDGgEw1Udc+pctEDVN1XKi4u5sYbbwT+\nmJJZvHg+U6ZU30e1nOjoaAyGbGQDsPuqvfS8apNuenq6yccdddPf1CIDTTsNI05X0MXPjxyDgWWp\nqdxyyy0WF0XIVgdRH4sJqmXLlkyZMsUZsQgTrP0BtlRhIi1tE1rtBOP9pcWL59O7d1SN4y5cmML0\n6bIB2F1VX3pefZNu3759TT7uqF8uaiwyqLrHdBG+zciguLjY6mRTtRdJHaxGf0Yve5FEXZaGWCkp\nKcqnn36qHD16VPntt9+U3377zS7Du/rIFF+l2veUNmzYaNXzq99zUhRF+eSTTxQfH40CW+u9v5Sb\nm+uQNh7O4IlTHdXfa1vvQUUHBZm8B1X7cUfZkFZ5DyooMkjxD/S3uQWGqWlCTZCmxlS0qevQ3ten\nJ1431Xly/Ha5BzV69Ogaf5KSkuwSXH0kQdneH6r666r/AMfFDVNAo0C3K/993Oz9JU++2D0t9tqL\nGpYtXWr1a6398K7vw9weH/RVx8jKyrL5tenp6UqryFaVyenKn6DIICU9Pd1s/ydH9IXytOumNk+O\n3y4JSlEU5cKFC8pPP/2kFBcXNzooa0iCUqqttjO/aMHSh8y+ffuuJKU/klzl11vNjqA8lSfFbmqx\nQxt/f5t/+ahPfav67L3iryHvvbkR1OHDh216vLEjKU+6bkzx5Pgb1bCwyueff05SUhIzZsxg7dq1\nUovPSSz1h7KmVNE///lPoAPUqH39J3x8Rsn9JRdqSAO/6hthu0dEsCktzexzTbXkmKCtLOVT3/ec\nqWovkmaDhqC1QcYySMXFxSb7P6Wnp0tfqGbIYoJas2YNH3zwAa1bt2bChAns2rXLGXE1e/X1hzLV\ntHDs2GR++ukn4+sLCwvp2LEjcILqSQ5y+eijD2QDrgvVrrNnaVGDrUmlvgTYmO62DVFfZZLEhERy\njuSw64Nd5BzJITEh0WyVh759+0r1h2bI4io+Hx8f1Go1Xl5eeHl5odFonBGXwHzVclNLyktLQ4mO\nvok1a1YCGFfseXlVoCg3AX8Ccrnttlu54447XPL3EZVq19nLMRhIWbDA7IjW3PJyc8vIza32q/ow\nd/SKv6qVpwcPHmTKk1PqXaVXu0q5uf5PPXr0kL5QzZGlOcCFCxcqU6ZMUW677TblueeeU+bNm2eX\n+cf6yD2o+plaQFFZFWKv4u/fus73/PyClGnTpin79u1zeeyO4omxW7uKr6CgQGmlVte4Z9VKra73\n/kt9q/rsveKveuxVCxkCIwIVVCjENuyekazis44nx2+XjbpTp07lq6++4rrrrqNLly7ExMQ4I2+K\nelRN/40dO4jS0lCgCFgG3IqPT1tAQ/X7Tn5+XYiPjzdu2BXuofroIS8vDzC/761cUbgViASyr3xd\nn6q6faaOVf17AQEBFBcXU1hY2OjRyE8//cTYR8ZSOrr0j/1R64BobK4Ybq7/k737Qgn3ZvEeVHFx\nMcXFxVx11VWcP3+ejz76yBlxCQsSE+PJyPgPfn6ngH9Q2SUoi/LyAioqjvPHfacvKS09SkBAgMti\nFdYxtxAiOzuba1q04BdgBZW9oLppNMb7Rubu89TXMyw0NJTfjhxhQJ8+xvOtWrGiwZXsN6WlcVN0\nNAZ1ac0q5kHAOZx6z6j2+yEV+j2YpSFWUlKSMm3aNGXBggXKggULlIULF9pleFcfmeKznqnNuVWP\n+ftfrYBG0Wj+bNVGX0+eLvDk2BVFUbKysoxLzwtAWQ9K6ytLz83V4CsoKLB5yXjVFJmp+n0aUP4c\nGGjztF9V7HtB0fhSs0afCiWgY4Dd9i1ZUnuv1KTHJtW7d8rTrxtPjt9uG3WdTRKUbUzNyx8+fFjx\n82tt00ZfT77YPTl2RVGU7du3K71btVI2ghIMSm9QWoCS8tJLiqKYvm9UX+IypXoya+3np1xdqwJ5\nL1DSG1Bstip2BZQNV5KUdzCKX4CfsnzFcqdVJqmzt2pMZYKsb++Up183nhy/Xe5BXXvttfzwww/0\n6NHD+JharXboqE7YxtS8fHFxMf7+nSktrduwUObw3U/Hjh35rbSUR4Ev+WOFXczcufx9/HiT95T2\n799v9eq+6kvVe+l0ZAE3XTnXrVfOdYLKe1yh9RzHXOxVKwMTgbAyGHHJj28zMmp8bjhanSK2auo0\nTpTOuZ7FYoJKT09nz549xq+9vLzYvXu3Q4MSjWepeKxwLyEhIcyYNYs1zz1nco9S1S8h1T9YLS0n\nr87UUvUuGg0jKirorFbzy8WLaK8819al5yEhIXWWza9MTTWZnBxZvbxOEVs9cIEaRW1l75SHsXY4\ndvr0aaWsrKxRQzpryRSffZgrHmuOO8VuK0+OXVH+KNRra18nc1N/tafV6usllfLSS0qgSqV0vTKt\nGKBS2XQPquq9t7QE3Nr7ZY1ZSl69iG31e1BVX8s9KPdhl3tQ3377rTJ48GBlxIgRSkxMjMW9NPWp\nqKhQnn/+eSU+Pl5JSkpSfv/9d5PPkwRlP7b8sLtb7Lbw5NgV5Y/4G7JHqfq/sTU1+BpzH8vUORvT\nbLH2eexRENaWorlN5brxRHZJUAkJCcrJkycVRVGUkydPKvfee2+DA/rnP/+pPPXUU4qiKEpmZqby\n6KOPmnyeJCjXkNhdp3r8DR1BWJMEah87PT3duMCh6k90UJDZTsoFBQXKSy+/pGgC/0giS5dZrsRu\nzXksteBwhKZ03VjLXVrq2KVYrI+PD+3atQOgXbt2+Pn5NXg68cCBAwwcOBCA66+/nh9//LHBxxLW\nkT0gnqe+/Uv1sabOXtWxAfbv309AQIDVdQHT0tLo1LkTz734HLoHdJx/6Dy6UTqmzZxm8fqypv5g\n1SIHKQjrOGlpaUR0jSDu/jgiukaQttF80WF3YDFBBQQE8N577/Hzzz/z3nvv0apVqwafrLi4mMDA\nQOPXvr6+VFRUNPh4zZW1Sceaiuei6bC2CG31DcED+vRhtFZLjEZD76AgYjQalqXWrXFXWFiINllL\nyW0lcBU1kohva1927NhR7/VorD9Yz3nMFYqVRQ32UfVvqBv1xy8X2vHOr2RvC4ur+F577TWWLVvG\n66+/TufOnZk7d26DTxYQEMClS5eMX1dUVODtbTpHVpV+8TQXL150aOxbt25j+vRZqFSRGAzZLFyY\nwsiRI+o8r6ioiHHjHqWk5MsrRWWzGDfuVnr2vI6QkJAGxV5UVMTx48fp2LGj2WO4iqPfd0ezV/wv\nL1jArdOm1ShCazAYjMcuKiri0XHj+LKkxLjc/NbVq9m6cyeXLl0y/tvWjiUzMxOf1j7QBfiMGivj\nivOLmfjsRMofK2fhKwsZOWKkydgGDhrEl999V+Maqn2eBfMXMG3mNFRtVBjOGljwSs347a05XTeZ\nmZn4tvGt88vF/v37iYqKclyQjWHNXOE///lPZcWKFcqePXsaNef4+eefG+9BZWRkKH//+99NPk/u\nQZlmS5ddaxoe2hK7re3nna053kswp757DLbec6p+TL8Av8r7Q/ei4I9CGxR8G14QtiHx21tzum5c\ncY+vPna5BzVr1ix27NiBn58fH330UaNGUHFxcajVahISEpg/fz5PP/10g4/VHFW12aheCLZq8y3U\nnPqz1PDQFqb6T2m1E9x6aqA5q+8elq29qKof842Fb8BqCNgN/ga49ywQAAy48iQ73TNq6D04UT9z\nTSLd+X22OMX3v//9jw8//BCAMWPGcP/99zf4ZF5eXrz44osNfn1zV9/m27S0TcYeUHp9NlptEmVl\neqA/EIZafZrU1BUNuhhN9Z+SqhSeyVQvKlP3nEwZ/8h4vBWYPnkyXTUqdpWVodZXoD+pl42wHiIx\nIZHYIaar3LsjiwmqU6dOxjnjoqIiwsLCnBGXMKGqzYZWG4NKFYHBkENq6jIA4winMol8yZIltwPf\nAmHAF3h7TyQ2dnCDzitVKZqW+lpxWPL38eMZeffdxtfu2r2LcY+MQx2iliaCHsKTWpZYTFCZmZkM\nGzaM8PBwTp06hVqtZsCAyjH9vn37HB6gqMlUl939+/fXGuG0BDryx1TgKNTqBQ0e8ZhLjJ5ykYu6\nbP2Qql2iqOq1iQmJ9Py/npSUlNj1N3JHlkRyJE+N211ZTFBSd8/9mKrJVnOEcwk4TvURj053hLNn\nz9ZpTFf9B6o+5trPi6ZvU1oaE7RaItVqsvV6lqWmEp/4R+v2kJAQwsPD7Xa+tLQ0tMlaY6v4xa8t\npnd07wZfd85KGrXjNtXiXtjI0iqK3bt3KxMnTlQefvhh4x9Hk1V8tqtdd8/b21+BNgpEKxCggEYJ\nDKxZk6/2yrylS5e5JHZ7aE6rsZzJmuoU9l6BWGOlWWxly4zAiMAGlT6yVDrJXrG7aoWcu1431rBL\nu41XXnmFOXPmNGqDrnC86iOcs2fPcv/9T3P+/E4gg8omCHu5eLFyNDV27CA6depQ675VFtOm3cp9\n990royNhZKoKui2tOKxRfYRTo2XGJeBrQAsX21+Ek6AdryV2SKxV566+MVXXXmfz621Rp9WHtPaw\nC4sJqlu3bvTr188ZsYhGqpr6KywsvDLllw+0oeb9qF6UloYSEzMUX99QTC1Zlx8oUcWWlh4NUXv6\ncP7ixX9UkyinUf2cjEkjUAe5QGvHJY06rT5kRaNdWExQQ4YMIT4+ns6dOxsfmzdvnkODEo1TfVGD\nj084xcVHocZHTBEGwycYDLdTvWWdrMwTphZDNHRZujXnqt1EMWbKFBa/vpgpM6bg08qH4jPFDf7Q\nj4yM5PKpy/AW0Bo4C5e5bJdr3NT7lLoiFe14Lapgld1XNDbbxReW5gDvuusuZfv27cpXX31l/ONo\ncg/KPqp25C9fvvJK+/duCgQrsFEBRdFoeip+fkHG+1bV70G5S8Vja7nT+94Q7hB/fa06HNGyIj09\nXflzYKCSDkpBraoWxmt3xfJ6+znVp6CgQFG3UNe4L4QvyvIVyxsVe333tRzxc1Pf+dzhumkou7Tb\nMFeOyJEkQTWOqR+Sw4cPK35+QQrsrVEm6fDhw3X6+pgqa+TuCcsd3vfGcHX8De0LpSgNj3358uUK\nvigBbVA0vijzzZyzoddeenq6EhgRWJmcqv60Q/Fr6Wc8lq2xO3sxhKXzufq6aQy7LJLw9/dHq9Vy\n3XXX4eXlBcDUqVMdPrJr6hw1ZK9dUSI1dRmJifH06NGDNWtWotXeU2MvU/W23Hl5efz000+MHfsI\npaXb0OluBbIYM2YAvr6qOscUTYczFkNUV1hYyJQnp8DDUHxl+u6p1bBy8eI652voxtLIyEj0RTXv\nC3EBVFc1/O/l7MUQzX3xhcUEFRMT44w4mhVzSaSxqtfMq1qZp9XGEBXVi+LiYmJjB5OT87PZxLh1\n6zamTXuG0tL2wD3AMmAwBkM5BsO+GseMjR3cLH5AmgtLiyEs/UJl6y9cpj54A8MDierd225/p6r6\ngcmTkiEYuADcAuXp5Q2+D+XsxRDNfvGFpSGWwWBQ3n//fWX27NnK2rVrldLSUrsM7+rTlKf4bKlI\nbitTFczVLMOeAAAgAElEQVShi+Lr21IJDPyz4ucXpCxfvtJsXP7+bWrEVXm/6m0FutpUFd0VPHmq\nQ1HcI35z7ebruzelKIqybMmSer9vijOnyl5b8Jqi8lcpLcNbNugeTu0pxg1pGxp8X6wh6jufO1w3\nDWWXe1BPP/20Mm/ePOWLL75QUlJSlBkzZtgluPo05QTVkDYY1jKV/ECjwHNXks31CmhMJqn09HQl\nMDC6VnLrpqjVAYpa3cohCdWePPkHVVHcJ/7aH8aW7k0VFBQobfz9G3Tvyhkf9FULDAIjAhW/AL8a\nCyQUxfL7bm6BgrPvyZo7n7tcNw1hlwQ1atSoGl/Hx8c3PCIrNeUE5cgRlKIoyksvpSjQ4koFidYK\ndLqSnP44n59fa5M3omuPoPz8WiuHDx+uU6XC3XpBKYpn/6AqinvEb+pD0FL/qPT0dCU6MNCq/lKm\nju/ID3prRmlZWVlmz+9u/ZNMcYfrpqHs0g+qtLQU3ZUbpyUlJZSXlzt82rEpq9qjpNHEEBTUG40m\nxq6FV8eP/zv+/mpgOvAf4Cy1N+qq1ZF1evaEhoaycGFKjbjWrFlOjx49SEyMJyfnZ3btWkFOzs+y\nQKIJqt4GvntEBJvS0gDL/aMiIyPJNhhsajNf/fiO7P1UdZ/L1EZfqKyd1/eWvsTdH0dE1wjSNqbZ\n9HrhBJYy2LZt25S4uDhlwoQJym233aZ8+umndsme9WnKI6gq9vrN0dRxqo94fH1bXpnmszxiy83N\ndfvl5OZ48m+SiuLa+C1N45m7N1Vl2dKl9X6/MUvYTcVq7fVZUFCg+Af4K9yNwoyaIyBrRkcygnIs\nu0zxKYqinD17VsnKylLOnDnT6KCs0RwSlD3U14a9+g9y1UbdwMCoep/nyRe7J8euKK6N35o28JY2\n6jamzby1ScdS4VdTz1e3UCsEVxac9fX3VV56+SXj+VpFtqqxRyoosu7UpLMXRNjKk6/7RiWoixcv\nKlOnTlUuXryoKIqifPzxx8oTTzxh/NqRJEFZZuu9rPpGWlLN3PXceQRliTX3Xc0d39qkY+toxmRV\ndN8/qqJXVaiw5njuPKvgydd9o+5BvfDCC/z5z3+mZcuWAAwbNoyePXsye/ZsZ80+inpUtWE3VezV\nlNpz/dX3TJ0/fwCdbi/Tps2isLDQGeELN2Kst6fR0DsoiBiNxm719uo7PmCsNn7+ofPoRunQjtea\nvAZtvR9U4/lVVdEfhotjL6IbpWPKjCksfm0x/uv9CVobhGaDxmztPEfeJxP1M7tRNy8vj4ULF/7x\nRF9ftFot8fFyg9wdNLYNe1WC+6MLr1Qzb86q2sBnZGQAEB0d7ZDj1+kEbWWVBFs3rNZ4vpmq6L2j\ne5P+dbrduwE3VLMtCFsPsyMoX1/TuUulUjksGGG9xq4GrJngQKqZiz27dpE4ciRP339/jZV29lJ7\nJFIjiUC9SaeqWrhmg8biiKf28wN2BsAZTJ4nJCTELUZHaWlpRHSNMLuisNkyN/f3zDPPKF988UWN\nx3bt2qU88cQTjZ98tEDuQVmvMfPjtfc3yT0o17F3V1pbrwlXFItVFNsXIdj6d7NUFd0drps698vG\nVBa0PXz4sMXXukP8DdWoYrEzZ85k6tSpLF26lA4dOpCfn09wcDCvvvqqM/OnsKChhTShZhfeyMhI\nDAaDnaMTzla7AeCy1FTiExMtvs6exWJtmapKTEgkdkis1c9v6PV+9113c/ddd5s8j6un1mrUJfwR\n2A6lLUqJ7hvNmlVrSEyw/O/XZFnKYLm5uUpGRoZy8uRJu2RNa8gIyjUkdtexR/yNGQXZawRlqW6f\nM1mzQnDJ0iWKJlCjtOzYUtEEumYZuXEENQYFDTbtu/Lk694ulSTCw8OJioqiXbt2zsiXQogGMo6C\nrnxdfRRkiT1W8lXvkHvg/Hn26nRM0JpeledohYWFFlcIFhYWMmXGFHQP6LikvYTuAR0PaR9yerxV\n98v8NvtBC6RyRTUWE5QjfPHFF0ybNs0Vp26WCgsL2b9/vywhb+IslSWyJD4xkZ9zclixaxc/5+RY\nNTVYXWMSpL1Zsyw9IyMDg7+hxnP0/nrjSkZnSkxIJGN/Bn6lflYtGmkunJ6gUlJSWLx4sbNP22yl\npW0iIqI7cXHJRER0Jy1tk6tDEg5ij1FQY/b8NDZB2lN9KwSrfmE7d+4cXKTGc7jo9FCNevTowZpV\na6xeqdgcmF0kER8fb+ygW0VRFLy8vNi4cWODT9i7d2/i4uLYtEk+KB2tsLCQceOSKSlZik4XB+RL\ns8EmztR+I2cxJkitlgiVihyDweoE2ZiFCqZeWzVtph2vRRWswnDGQOqKVHbt2oU2WYs6WI2+SI8X\nXihrFWgNnAOVr8rue8BsYeuikabObIJatGhRow68efNm1q1bV+OxefPmMWzYMNLT0xt1bGGdFStW\nUVKiBxYCjwHLZDNuM9CYlZ2N1ZAEmZaW9kfSOKMndUWq1SvX6ntt7Q97gIiuEehG6SpXzB0Dn40+\n+Hj7oPJSUe5bzjur3nH5z4Yr//3cjZeiKEp9T8jJyWHnzp3GJcgFBQXMmTOnUSdNT09n06ZNNSpV\nVHfgwAHCwsIadQ5XuXjxIoGBga4Og6KiIvr2HURJyZf80cT7Vvz8Kti//9+EhITUeY27xN4Qnhw7\neHb8jYm9qKiIvrf0peSBEmOFCP/1/qR/nV7nGi0qKuL48eN07NiRkJAQm14LkJmZScKEBC6OvWhc\nzk0LUOvUPDHpCUaPHm3yde7Mk6+b/Px8+vTpU+9zzI6gqkybNo24uDgOHjxI27ZtuXz5st0CrE94\neLhTzmNveXl5bhF7bm4ufn5XU1JS/ZZ1MGVlefz442GTPZ3cJfaG8OTYwbPjb0zsubm5+IX4UdK+\npPKB9qAOUVNSUlLjmKZGSl27dLXqtVVUKhVlZ8vgGJXJaUzla/Qn9by1/C2mT5/ucSMXT75u8vPz\nLT7H4iKJFi1aMH78eNq1a8f8+fM5ffq0XYIT9lF1w/enn36qsVLPVCkjOEt5+Q602gmyok+4BWvK\nHZlbMh4QEGB1qSSQ5dyeyGKC8vLyorCwkEuXLnH58mW7jKD69u1rdnpPWK9qhd6gQVquu64PgwbF\nG1fqVdXq8/MbBFwDxADLgP/D2/sqlyylFaI2a2rsmVsyXlxcbFN9PpDl3B7H0k7e9PR0Zf369cqu\nXbuU/v37K/Pnz2/8FmILpJKEZab6QUGwAntr9IU6fPiw4ucXpMBeBTYq0EaBrnUaFzozdkfw5NgV\nxbPjt1cVDHM19iz1gmpI7cGqGoCBnQLdshGhtTz5umlULb4qN954I126dOH48ePs2LGD1q1bOyNv\nCgtMtcuACKBljZV6PXr0YM2alYwbd9eVFX3fAL3Q6bJkyblwG/WtXDO3ZLz6knJbr+GqFX779+93\ni2rmwjSLCWr9+vWsW7eObt26ceTIESZMmMCIESOcEZuoh6l+UJADXKrTNiMxMZ6QkDbcffeTXLok\n/Z+E53HE/qDQ0FCioqLk+ndjFhPUhx9+yCeffIKfnx86nY7Ro0dLgnIDVfeYtNoYIByd7ij+/u3w\n8rrHZF+o6OhoKiqO09AGh0K4muwPan4sJqiQkBB8fHwA8Pf3lyk+N1K9XUZAQADFxcVmf7usntBU\nqggMhhybGhwKIYSzWUxQiqIwcuRIoqOjOXz4MGVlZcZCr7ISz/Vs+a2ydv8nSU5CCHdmMUElJycb\n/3/48OEODUY4nkyTCCE8hdkEtXfvXmJiYvjtt9/qFI2Nj69bhUAIIYSwJ7MJ6ty5cwBSOaIZc3Ur\nbCFE82a2ksRdd90FVE7rRUZGMmnSJEpKShg5cqTTghOuI32khBCuZrHU0cyZM+nQoQMAgwYNYtas\nWQ4PStiXrR11CwsL0WonoNPt5fz5A+h0e6V+nxDC6azqqBsVFQVUVpWoqKhwaEDCvuobCZlLXFVV\nKqDupl4hhHAWiwkqKCiITZs28csvv/Dhhx/SsmVLZ8Ql7KC+kVB9ictUJXTZ1CuEcDaLCWr+/Pkc\nOXKE1157jaNHjzJ37lxnxCXswNxIKCMjw2TiKioqAv7Y1KvRxBAU1BuNJkY29QohnM7iPqjg4GCS\nk5MpLS0FoKSkxOFBCfswVa/PYMgBqFNoVqWK4Pjx4/z5z38GZFOvEML1LCao2bNn89VXX9G2bVsU\nRcHLy4uNGzc6IzbRSObKG0VHR5tMXB07dqzzeklMQghXsZigsrKy2LVrF97eVq2nEG7G3EjIVOIK\nCQlxcbRCCPEHiwkqIiKC0tJSNBqNM+IRDmBqJGQqceXl5bkoQiGEqMtigsrPzycmJoaIiAgAmeJr\nQmQKTwjhziwmKKlYLoQQwhXMJqgPP/yQ++67j40bN9YpFjt16lSHByaEEKJ5M5ug2rdvD1Teg6pq\nWCicQ4q0CiFEPQlq4MCBAOzYsYN33nnHaQE1d2lpm9BqJ6BWV+5hSk1dRmKitDcRQjQ/VpU62r17\nN0ePHuXYsWMcO3bMGXE1S44q0mprsVghhHAHFhdJFBUVsXbtWuPXXl5evPvuu46MqdmqKk1Uu8JD\ndnZ2g6f6ZEQmhP3I9Ltz1ZugiouLWblypeyBchJzpYkaWqS1+oisMullodXGEBs7WH64hLBRWloa\n2mQt6mA1+jN6UlekkpiQ6OqwmjSzU3zvv/8+d955JyNGjODf//63XU5WXFxMcnIySUlJJCQkkJmZ\naZfjNhX2LtIqbTOEsI/CwkK0yVp0o3Scf+g8ulE6tOO1Mm3uYGZHUJ9++ik7d+6kuLiYJ5980rho\nojHWrFnDzTffzIMPPsixY8eYNm0aW7ZsafRxmxJ7Fmm194hMiOYqOzsbdbAaXXtd5QPtQRWsatT0\nu7DMbIJSq9Wo1WqCg4MxGAx2OdnYsWNRq9UAlJWV4efnZ5fjNjX2qvBgrlis/EAJYZvIyEj0Z/Rw\nEmgPnATDGYP8sudgFhdJACiKYvOBN2/ezLp162o8Nm/ePHr27ElhYSFPPvmktI93AmmbIUTjhYaG\nkroiFe14LapgFYYzBlJXpMrPk4N5KWayz80330z//v1RFIVvv/2W/v37G7/XmPJHv/zyC9OnT2fm\nzJkMGDDA5HMOHDhAWFhYg8/hShcvXiQwMNDVYTSIxO46nhx/c4q9qKiI48eP07FjR7eo/u/J731+\nfj59+vSp9zlmE1R6errZF/Xt27dBAR05coTHHnuM119/nWuvvdbs8w4cOGAxcHeVl5dHeHi4q8No\nEInddTw5fonddTw5fms+581O8TU0CdVn0aJF6PV6UlJSUBSFoKAgli5davfzCCGE8HxW3YOyl2XL\nljnzdE2abBgUQjR10ibXA6WlbSIiojtxcclERHQnLW2Tq0MSQgi7kwTlYRxVr08IIdyNJCgPI9Uh\n3NMnn3yCVqt1dRhCNCmSoDxMzeoQINUhnGfw4MF88803Jr83fPhwUlNTnRbLkiVLePLJJ512PiFc\nQRKUh7F3vT7ReOXl5a4OQYgmSRKUB0pMjCcn52d27VpBTs7P0j4DyMjIICpqIO3bd2PUqIe5ePGi\nw861detWEhMTmTdvHv369WPJkiVs3bqVUaNGGZ8zd+5cbr75Zvr06cOdd97JkSNHTB7r7NmzJCcn\nM3z4cPr168fo0aON3ysoKODxxx+nf//+xMbG8t577wHw73//m+XLl7Njxw6io6MZOXKk8fmPPvoo\n/fr1469//Ssffvih8VhZWVncc8899OnThwEDBvDKK68Yvzd58mQGDBjAjTfeSFJSktlYhXA2py4z\nF/Zjr3p9TUFOTg7x8Q9x6dLrQB+2bHmZM2ceYufOfzjsnFlZWdxxxx188803lJWVsX37dry8vADY\nt28fBw4c4J///CcBAQH89ttvBAUFmTzOmjVraN++Pdu2bSMsLMxY4V9RFJKTk4mLi2Px4sXk5+cz\nduxYOnfuzMCBA0lOTub333/n1VdfNR5rypQpdO/enTfffJOjR48yduxYOnXqRL9+/Zg7dy5jxozh\nzjvvRKfT8euvvxpfN2jQIObPn4+vry8LFixg+vTpfPTRRw5774SwloyghMfbvXs3inIb8ADQndLS\n1eza9Yndihyb0q5dOx544AG8vb2NBZCr+Pr6cunSJY4ePYqiKHTu3JmrrrrK5HF8fX0pLCwkPz8f\nHx8f4876Q4cOce7cOR599FF8fHzo0KED9913H9u3bzd5nJMnT5KZmcn06dNRqVR0796d++67z5ho\nfH19+f333zl79iwajYZevXoZX3v33Xej0WhQqVRMnDiRn3/+meLiYnu8TUI0ioyghMdr2bIlXl4n\nAQXwAk7h46PC19dxl3f79u3Nfu+mm25i9OjRvPjii+Tn5xMXF8fMmTO5cOECt99+O1DZmfrgwYNo\ntVrjggdfX1/uu+8+HnnkEXJzczl16pSxoouiKFRUVHDjjTeaPGdBQQGtWrWq0Vw0PDyc//73v0Dl\nlOMbb7zBsGHD6NixIxMnTuTWW2+loqKCRYsW8fnnn3P27Fm8vLzw8vLi7NmzBAQE2OvtEqJBJEEJ\nj3fnnXfSvv1cTpxIpLS0Dy1arOLZZ2cbp9wcwdKxR48ezejRozlz5gyTJ08mNTWVxx9/nIyMjBrP\na9myJTNnziQpKYnLly/z4IMP0qtXL8LCwujQoQOff/65VfG0bduW8+fPc/nyZVq0aAFUFuNs27Yt\nAJ06dTIWef788895/PHHSU9PZ+fOnezdu5d169YRHh7OxYsXzSZBIZxNpviEx9NoNHz22WZefLE3\nEyfms379qzz99AyXxXPo0CGysrIoKyvD398fPz8/vL1N/6h9+eWX/P7770BlsvLx8cHb25tevXrR\nsmVLVq1aRWlpKeXl5fz6668cOnQIgKuuuorc3FxjK5z27dsTHR1trHf5888/s3nzZkaMGAHAxx9/\nzJkzZwAIDAzEy8sLb29vLl++jFqtJigoiMuXL7Nw4UKHJnYhbCEjKNEkVI5EHLsvyNoP7uLiYubN\nm8eJEyfw8/NjwIABZjfxZmdnM2fOHM6cOUPr1q154IEHjNN6K1asYP78+QwZMgSDwcDVV1/N5MmT\nARg6dCgff/wx/fr1o0OHDmzZsoWFCxfywgsvMHDgQFq1asXkyZO56aabgMqVf/Pnz6ekpIQ//elP\nLF68GLVazciRI9m3bx9/+ctfaN26NZMnT2bTJimd1VBSI9O+zLbbcCVpt+EaErvreHL8EnultLQ0\ntMla1MFq9Gf0pK5IJTEh0S7HNseT33trPudlik8IIRqpsLAQbbIW3Sgd5x86j26UDu14rdTIbCRJ\nUEIIYaPCwkL2799vTEDZ2dmog9VQtbizPaiCVVIjs5EkQQkhhA3S0tKI6BpB3P1xRHSNIG1jWmWN\nzDN6OHnlSSfBcMYgNTIbSRZJCCGElapP5ena6+AkaMdryTmSQ+qKVLTjtaiCVRjOGEhdkSoLJRpJ\nElQTJauJhLC/qqk8XXtd5QPVpvISExKJHRIrP3d2JFN8TZB03BXCMSxN5YWGhnLjjTdKcrITSVBN\njHTcFcJxQkNDSV2RimaDhqC1QWg2aGQqz4Fkiq+Jqeq4q9PV7bgrP0RCNJ5M5TmPjKCaGOm46xru\n3vLdHvGlp6czaNAgO0Xk2WQqzzkkQTUx0nHXcdyp5but7BWf1OkTziRTfE1QYmI8sbGDZQrCScrL\ny/Hx8XF1GCiK4rYJpKKiwmzBXCHMkSumiWpuUxAZGRkMjIqiW/v2PDxqlMe0fL/99tv517/+Zfy6\nvLyc/v3789NPPwGQmZlJQkICN954IyNHjiQ9Pd343KSkJBYvXkxiYiJRUVGcOHGCLVu2EBsbS+/e\nvYmNjeXTTz81xlw9vl9//ZVx48bRr18/BgwYwMqVKwHQ6/WkpKQwcOBA/vKXvzB37lyzjR+PHj1K\nUlISw4cPZ/jw4ezZs8f4vaeffprZs2fzyCOPEB0dzXfffWfr2yyEjKCE58vJyeGh+Hhev3SJPsDL\nW7bw0Jkz/GPnToed014t3++44w4++eQTpk6dClRWHQ8ODqZHjx6cOnWK8ePHs2DBAgYOHMg333zD\nY489xs6dO2nTpg1QeW9p1apVXH311Vy+fJmUlBS2bNlCREQEp0+f5vz588ZzVcV36dIlxo4dy8MP\nP8zy5cspKyszJtC3336bQ4cO8fHHHwPw6KOP8vbbb/P444/XiLusrIxHH32Ue++9l7lz55Kbm8uE\nCRPYsmWL8X7n9u3bWbVqFVFRUej1eju986I5ceoISqfTMWHCBEaPHs24ceMoKChw5ulFE7V7925u\nU5QrDd9hdWkpn+za5REt3++44w727Nlj/AD/9NNP+dvf/gZU9nC69dZbGThwIAD9+/enZ8+eNUZc\nd911F126dMHb2xsfHx98fHz43//+R2lpKVdddRVdunSpc84vv/yStm3b8tBDD6FWq2nRooWxBfyn\nn37KxIkTadOmDW3atGHSpEls27atzjEyMzO5fPkyjzzyCD4+Ptx0003ExMQYR2wAQ4YMISoqCqDO\neySENZyaoD744AN69uzJ+++/z/Dhw1m1apUzTy+aqJYtW3LSy4uqvjGnAJWPj1u0fL/55pt5/vnn\nuXTpEvn5+URHRxMdHU3v3r2Byk63Xbt25T//+Q8lJSXs2bOH4cOHA5WtFD777DP69u1L3759ufHG\nGzl48CCnT582GYdGo2Hx4sWkpaUxYMAAkpOT+e233+rEl5+fT8eOHU3GXlBQUKN9Q3h4uMlfJAsK\nCggLC6vxWO3n1vceCWENp07xjRkzxtgBNC8vj1atWjnz9KKJuvPOO5nbvj2JJ07Qp7SUVS1aMPvZ\nZz2i5TtU3ofavXs3rVq1olu3bsbkERYWxsiRI5kzZ47Vcdxyyy3ccsst6PV6Fi9ezPPPP8/7779f\n4zlhYWHs2LHD5PHatWtHbm6uceSVl5dnbBtfXdu2bcnPz6/xWF5eHldffbXZ2ISwlcMS1ObNm1m3\nbl2Nx+bNm0fPnj0ZM2YMv/76K++8847Z1+fl5TkqNIe6ePGixO4Caz74gC3/+AdH8vJ4auBAhg4d\nave/S3l5OUVFRZw9exa9Xl/j+NUf++WXX6ioqOCaa64xTt1dunTJbDw33HADixYt4sKFCwwaNMj4\nvH79+rF27Vr69OlDnz59KCsr4/Dhw3To0IGrrroKvV7PuXPnjM8/e/Yshw8fpk+fPqjVasrLyzEY\nDOTl5dWIr3v37pw6dYq33nqLO++8k7KyMrKzs+nRowd/+ctfeOONN4yLa15//XUGDx5MXl4ep0+f\npry83Ji0VCoVCxcuZNiwYWRmZrJ3717i4+PJy8vj8uXLHnE9eUKM9fH0+C1xWIK69957uffee01+\nb926dfz222+MHz+eL774wuRzPLVLpCd3uPTk2AFeTklx6PF9fX0JCQnBYDCgVqtrvFdt2rQxPpaT\nk1On5fsTTzyBRqMxedzw8HD+7//+j0OHDrF8+XJCQkKMjy9fvpzXXnuNuXPn4uPjQ69evZg9ezbt\n27fHz8+P1q1bG+NQqVTMnz+fV199FS8vL7p3787cuXMJDw+vER9U/gy+/PLLvPfee6jVasaMGcOQ\nIUN48sknee211/j73/+Ol5cXw4YNY/r06ajVak6cOIGPj4/xGKtXr2b27NmsX7+e8PBwXnvtNWO7\n+hYtWhAYGOj215OnX/OeHH/tEbgpTm35vnLlStq1a8eIESM4efIkDz30EDtNrLSSlu+uIbG7jifH\nL7G7jifHb83nvFPvQd1zzz3MnDmTzZs3oygK8+bNc+bphRBCeBCnJqiQkBBWr17tzFMKIYTwUFJJ\nQgghhFuSBCWEEMItSYISQgjhliRBCSGEcEuSoIQQQrglSVBCCCHckiQoIezAES3f8/Pz6d27Nw3d\nS2/L6xt7LiEcQRKUEFZydsv3sLAwDh482OCiq7a8vrHnEsIRJEEJ0Ujl5eUuOa+MdkRTJwlKNAkZ\nGRlE9Y2ifUR7Ro1pGi3fc3Nz6d69OxUVFYDpFu8nTpxg9OjR9OnTh3HjxjFnzhxmzJgBYPL1b7zx\nBomJifTu3RutVsu5c+dMPvf8+fM8/fTTDBw4kH79+jFp0iQALly4QHJyMv3796dfv34kJyfX6E8l\nhD1JghIeLycnh/gH4vmh4w+cGn6KLYe2cN+o+xx6zqysLDp16sQ333zDo48+CmCy5fuBAwd4/fXX\nad26tcnjVLV8r1K95Xv1Y1b55JNPePnllzl48CBhYWFMnz6d66+/nu+++46JEyeybdu2Gq+p/frt\n27fzyiuv8O2336LX62u0vKn+3BkzZlBaWspnn33Gf/7zHx566CEAKioquOeee/jXv/7F3r178ff3\n580337T17RPCKpKghMfbvXs3ShcFegGhUHp7Kbt2en7Ld1Oqt3gvLCzkxx9/5PHHH8fX15c+ffow\nePDgeuO+++676dSpE2q1mmHDhvHTTz/VeU5BQQH79u1jzpw5BAQE4OPjww033ABA69atiYuLM7aK\nHz9+PD/88EO95xSioZxaLFYIR2jZsiVexV6gAF7AJfDxdY+W7/n5+cTFxTFz5kwuXLjA7bffDlSO\nVg4ePFij5Xv79u3Zs2cPkydPtuq8BQUFtGrVCj8/P+NjYWFhnDx50uzrqydKjUbD5cuX6zzn5MmT\ntGrVioCAgDrfKykpYe7cuezbt48LFy6gKAqXL19GURRZYCHsTkZQwuPdeeedtPdpj99HfvA1tNjY\ngtmzZ7u85fuWLVvYvn07x44dIzU1lbCwMDIyMsjIyODgwYPG51a1fN+9e3eNlu+WzhsaGsr58+cp\nLS01PmZNEzhLwsLCOH/+PMXFxXW+984775Cdnc3mzZv5/vvvWb9+PSALNoRjSIISHk+j0fDZts94\nMfFFJvaYyPq31/P0zKddFs+hQ4fIysqirKwMf39//Pz88PY2/6P2t7/9je+//560tDTuuOOOGt+r\n7zcL62sAAAviSURBVIM/PDycnj178tZbb2EwGMjIyGDv3r1Wv762queGhobyl7/8hdmzZ3PhwgUM\nBgPff/89UNm63t/fn4CAAM6dO8dbb71l9fGFsJUkKNEktGzZkpkzZ7LkjSWMHDnSIeewdkRWXFzM\ns88+S9++fRkyZAht2rSpdxNvaGgo1113HZmZmcYpQFPnNHX+1157jYyMDG666SbefPNNbr/99hr3\nxCy93ty5Xn31VXx9fRk2bBgDBgzg3XffBWDMmDHodDr69etHQkICgwYNqveYQjSGU1u+W0tavruG\nxO469op/ypQpdOnSxbgs3Bk8+b335NjBs+O35nNeRlBCeLBDhw5x/PhxFEXhq6++Ys+ePcTGxro6\nLCHsQlbxCeHBTp8+zWOPPcb58+dp164dL774It27d3d1WELYhSQoITxYTEwMMTExrg5DCIeQKT4h\nhBBuSRKUEEIItyQJSgghhFuSBCWEEMItSYISQgjhllySoI4ePcoNN9xgrOAshBBC1Ob0BFVcXMyr\nr75aowKzEEIIUZvTE9Tzzz/P1KlT8ff3d/aphRBCeBCHbdTdvHkz69atq/FYeHg4f/vb37j22mul\nPL8QQoh6ObVY7F//+lfatWuHoij88MMPXH/99bz33nt1nnfgwAFnhSSEEMJFLBWLdVk188GDB/P5\n55+jUqlccXohhBBuzmXLzL28vGSaTwghhFlu2Q9KCCGEkI26Qggh3JLbJihP3cyr0+mYMGECo0eP\nZty4cRQUFLg6JKsVFxeTnJxMUlISCQkJZGZmujokm33xxRdMmzbN1WFYRVEUXnjhBRISEnjwwQc5\nfvy4q0Oy2Q8//EBSUpKrw7BZWVkZTz75JA888AD3338/e/bscXVIVquoqOCZZ54hMTGRBx54gCNH\njrg6JJsVFRVx6623cuzYsXqf55YJypM3837wwQf07NmT999/n+HDh7Nq1SpXh2S1NWvWcPPNN/Pe\ne+8xb9485syZ4+qQbJKSksLixYtdHYbVdu3ahV6vZ+PGjUybNo158+a5OiSbrF69mmeffRaDweDq\nUGz28ccf06ZNG9avX8+qVat46aWXXB2S1fbs2YOXlxdpaWlMnjyZRYsWuTokm5SVlfHCCy9YtRfW\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1101d5208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with plt.style.context('seaborn-whitegrid'):\n",
    "    plt.figure(figsize=(6, 4))\n",
    "    for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'), \n",
    "                        ('blue', 'red', 'green')):\n",
    "        plt.scatter(Y[y==lab, 0],\n",
    "                    Y[y==lab, 1],\n",
    "                    label=lab,\n",
    "                    c=col)\n",
    "    plt.xlabel('Principal Component 1')\n",
    "    plt.ylabel('Principal Component 2')\n",
    "    plt.legend(loc='lower center')\n",
    "    plt.tight_layout()\n",
    "\n",
    "    plt.savefig('/Users/Sebastian/Desktop/pca1.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>\n",
    "<a name=\"mat_pca\"></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>\n",
    "<a name=\"sklearn_pca\"> </a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Shortcut - PCA in scikit-learn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[[back to top](#Sections)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For educational purposes, we went a long way to apply the PCA to the Iris dataset. But luckily, there is already implementation in scikit-learn. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA as sklearnPCA\n",
    "sklearn_pca = sklearnPCA(n_components=2)\n",
    "Y_sklearn = sklearn_pca.fit_transform(X_std)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10b5d3da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with plt.style.context('seaborn-whitegrid'):\n",
    "    plt.figure(figsize=(6, 4))\n",
    "    for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'), \n",
    "                        ('blue', 'red', 'green')):\n",
    "        plt.scatter(Y_sklearn[y==lab, 0],\n",
    "                    Y_sklearn[y==lab, 1],\n",
    "                    label=lab,\n",
    "                    c=col)\n",
    "    plt.xlabel('Principal Component 1')\n",
    "    plt.ylabel('Principal Component 2')\n",
    "    plt.legend(loc='lower center')\n",
    "    plt.tight_layout()\n",
    "    plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
